/*
 	Tool for Path Finding Algorithm Testing (ToPFAT) 
 	
    Copyright (C) 2009, Teemu Turunen and Arttu Viljakainen 
    Published under GNU General Public License V3 
    (see http://www.gnu.org/licenses/licenses.html)
    
    This file is part of Tool for Path Finding Algorithm Testing.

    Tool for Path Finding Algorithm Testing is free software: you can 
    redistribute it and/or modify it under the terms of the GNU General 
    Public License as published by the Free Software Foundation, 
    either version 3 of the License, or (at your option) any later version.

    Tool for Path Finding Algorithm Testing is distributed in the hope that it
    will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General 
    Public License for more details.

    You should have received a copy of the GNU General Public License
    along with Tool for Path Finding Algorithm Testing. If not, see         <http://www.gnu.org/licenses/>.
 */

package pathfinding;

import algorithms.PathFindingAlgorithm;
import pathfinding.gui.Map;
import pathfinding.gui.MapCell;
import pathfinding.gui.MapCell.CellIkonType;

/**
 * Class for containing user settings and for setting
 * these settings to MapCells.
 * 
 * @author teturun
 *
 */
public class SettingsObject {

	private CellTerrainType cellTerrainType;
	private CellIkonType cellIconType;
	
	private PathFindingAlgorithm algorithm;
	
	private static SettingsObject SINGLETON;
	
	private SettingsObject() {
	}
	
	public static SettingsObject getInstance() {
		if (SINGLETON == null) {
			SINGLETON = new SettingsObject();
		}
		return SINGLETON;
	}
	
	public void setCellTerrainType(CellTerrainType cellTerrainType) {
		this.cellTerrainType = cellTerrainType;
		this.cellIconType = null;
	}
	
	public void setCellRole(CellIkonType cellIconType) {
		this.cellIconType = cellIconType;
		this.cellTerrainType = null;
	}
	
	public void doSettings(MapCell mapCell) {
		
		doCellTerrainTypeSettings(mapCell);
		doCellIconTypeSettings(mapCell);
		
	}
	
	private void doCellTerrainTypeSettings(MapCell mapCell) {
		if (cellTerrainType != null) {
			
			if (mapCell.getParent() != null && 
					mapCell.getParent() instanceof Map) {
				
				Map map = (Map) mapCell.getParent();
				mapCell.setCellTerrainType(this.cellTerrainType);
				map.setAsNotSpecialCell(mapCell);
			}
			
			
		}
	}
	
	private void doCellIconTypeSettings(MapCell mapCell) {

		if (cellIconType != null) {

			if (mapCell.getParent() != null && 
					mapCell.getParent() instanceof Map) {
				
				System.out.println("MAP ON PARENT");
				
				Map map = (Map) mapCell.getParent();

				switch (cellIconType) {
				
					case START:
						map.setStartCellTo(mapCell);
						this.cellTerrainType = CellTerrainType.FLOOR;
						mapCell.setCellTerrainType(this.cellTerrainType);
						break;
						
					case GOAL:
						map.setGoalCellTo(mapCell);
						this.cellTerrainType = CellTerrainType.FLOOR;
						mapCell.setCellTerrainType(this.cellTerrainType);
						break;
						
				}
			}

		}
	}

	public PathFindingAlgorithm getAlgorithm() {
		return algorithm;
	}

	public void setAlgorithm(PathFindingAlgorithm algorithm) {
		this.algorithm = algorithm;
	}
	
}
